/***************************************************************************
 *   Copyright (C) 2007 by Ivan Vasić                    *
 *   ivasic@gmail.com                     *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#ifndef DBFACTORY_H
#define DBFACTORY_H

class AnnounceHandler;
class SHA1Hash;
class SqlObjectsModel;
class ModelTorrent;
class ModelUser;
class QAbstractItemModel;

class QString;
class QStringList;

#include <QtGlobal>


/**
 @author Ivan Vasić <ivasic@gmail.com>
*/
class DBFactory
{
	public:
		DBFactory();
		virtual ~DBFactory();
		
		/**
		 * @brief Handler za AnnounceRequest.
		 */
		virtual AnnounceHandler* createAnnounceHandler() const = 0;
		
		/**
		 * @brief Proverava da li je torrent sa infohash-om registrovan u bazi.
		 */
		virtual bool isTorrentRegistered(const SHA1Hash& infohash) const = 0;
		
		/**
		 * @brief Registruje novi torrent.
		 * @param metainfo ByteArray metainfo fajla.
		 * @param name Ime torrenta
		 * @param description Opis torrenta (pojavice se u interfejsu kao opis za ovaj torrent)
		 * 
		 * @throws TorrentExistsException kada torrent sa istim infohash-om postoji.
		 * @throws DecodingException
		 */
		virtual void registerTorrent(const SHA1Hash& infohash, const QByteArray& metainfo, const QString& name, const QString& description, quint64 size, const QString& addedBy) = 0;
		
		
		virtual void updateTorrentDescription(const QString & infohash, const QString& newDescription) const = 0;
		
		/**
		 * @brief Registruje novog korisnika na sistem.
		 * @param username Korisnicko ime korisnika.
		 * @param password Lozinka korisnika.
		 * @param email Email korisnika.
		 * @param name Ime korisnika
		 * 
		 * Passkey se automatski generise.
		 */
		virtual void registerUser(const QString& username, const QString& password, const QString& email, const QString& name) = 0;
		
		
		/**
		 * @brief Proverava da li postoji korisnik sa zadatim username-om.
		 * @param username Korisnicko ime.
		 * @param email Email korisnika.
		 * @param userExists OUT parametar. Pointer na bool u koji se upisuje TRUE ako korisnicko ime postoji.
		 * @param emailExists OUT parametar. Pointer na bool u koji se upisuje TRUE ako email postoji.
		 * @return TRUE ako postoji korisnik ili FALSE u suprotnom.
		 */
		virtual bool userExists(const QString& username, const QString& email, bool* userExists, bool* emailExists) = 0;
		
		/**
		 * @brief Proverava da li postoji korisnik sa zadatim passkey-em.
		 * @param passkey Passkey za proveru
		 * @param username Ukoliko passkey postoji i ukoliko je username != 0 funkcija postavlja username na ovaj parametar.
		 * @return TRUE ako postoji ili FALSE u suprotnom
		 */
		virtual bool passkeyExists(const QString& passkey, QString* username = 0) = 0;
		
		
		/**
		 * @brief Resetuje passkey korisnika.
		 * @param username Korisnicko ime korisnika.
		 * @param password Lozinka korisnika.
		 * 
		 * Stari passkey se brise a novi se automatski generise
		 */
		virtual void resetPasskey(const QString& username, const QString& password) = 0;
		
		/**
		 * @brief Menja podatke korisnika.
		 * @param username Korisnicko ime korisnika.
		 * @param password Lozinka korisnika.
		 * @param email Email korisnika.		 
		 * 
		 * Korisnik se identifikuje po username (ne moze da se menja) a parametri koji se menjaju su password i email.
		 */
		virtual void changeUserInfo(const QString& username, const QString& password, const QString& email) = 0;
		
		virtual void timeout() = 0;
		
//		virtual const QString& driverName() const = 0;		
		
		/**
		 * @brief Kreira novi SqlObjectsModel za tip 'Torrent'.
		 * @return Pointer na kreirani objekat.
		 * @note Objekat obrisati po prestanku koriscenja!
		 */
		virtual SqlObjectsModel* createTorrentsSqlModel() = 0;
		
		/**
		 * @brief Kreira novi SqlObjectsModel za tip 'User'.
		 * @return Pointer na kreirani objekat.
		 * @note Objekat obrisati po prestanku koriscenja!
		 */
		virtual SqlObjectsModel* createUsersSqlModel() = 0;
		
		
		/**
		 * @brief Kreira novi Model za tip 'Torrent'.
		 * @param id Parametar za identifikaciju (ime kolone u tabeli)
		 * @return Pointer na kreirani objekat.
		 * @note Objekat obrisati po prestanku koriscenja!
		 */
		virtual ModelTorrent* createModelTorrent(const QString id) = 0;
		
		/**
		 * @brief Kreira novi Model za tip 'User'.
		 * @param id Parametar za identifikaciju (ime kolone u tabeli)
		 * @return Pointer na kreirani objekat.
		 * @note Objekat obrisati po prestanku koriscenja!
		 */		
		virtual ModelUser* createModelUser(const QString id) = 0;
		
		/**
		 * @brief Kreira model (listu) Torrenta za odredjenog usera.
		 * @param username Identifikacija usera ciju listu zelimo.
		 * @param complete za TRUE fja vraca samo kompletirane torrente u suprotnom one koji se trenutno skidaju (tj. incomplete)
		 */
		virtual QAbstractItemModel* getTorrentListForUser(const QString& username, bool complete) const = 0;
		
		//////	PROCEDURES !!!	//////////
		
		///Vraca listu username-a svih registrovanih usera.
		virtual QStringList getAllUsernames() const = 0;
		
		///Vraca broj korisnika koji su trenutno aktivni
		virtual int usersOnline() const = 0;
		
		/**
		 * @brief Broji korisnike po torrentu
		 * @param infohash Identifikacija torrenta
		 * @param seeders pointer na int gde se upisuje broj korisnika koji seeduju torrent sa infohashom infohash.
		 * @param leechers pointer na int gde se upisuje broj korisnika koji skidaju torrent sa infohashom infohash.
		 */
		virtual void countPeers(const QString& infohash, int* seeders, int* leechers) const = 0;
		
		
		/**
		 * @brief Vraca ukupan broj aktivnih korisnika
		 * @param seeders pointer na int gde se upisuje broj korisnika koji seeduju torrente
		 * @param leechers pointer na int gde se upisuje broj korisnika koji skidaju torrente
		 */
		virtual void countTotalPeers(int* seeders, int* leechers) const = 0;
};

#endif
